package com.zzyl.task;

import com.zzyl.nursing.domain.Contract;
import com.zzyl.nursing.service.IContractService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.List;

@Slf4j
@Component
public class CheckContractTask {

    @Autowired
    private IContractService contractService;

    /**
     * 每天凌晨1点执行，检查合同状态
     * cron表达式：秒 分 时 日 月 周
     * "0 0 1 * * ?" 表示每天凌晨1点执行
     */
    @Scheduled(cron = "0 0 1 * * ?")
    public void checkContractStatus() {
        log.info("开始执行合同状态检查任务");

        try {
            // 获取所有合同信息(无论状态)
            List<Contract> list = contractService.selectContractList(new Contract());
            /***
             * 遍历合同
             *      1)now() <= startDate  合同未生效 status=0
             *      2)now()>=startDate && now() <endDate 合同已生效 status=1
             *      3)now() > endDate  合同已过期 status=2
             *      4)特殊情况  此处暂不考虑 合同已失效 status=3
             */
            LocalDateTime now = LocalDateTime.now();
            int updateCount = 0;

            for (Contract contract : list) {
                Integer oldStatus = contract.getStatus();
                Integer newStatus = null;


                if (contract.getStartDate().isAfter(now)) {
                    newStatus = 0; // 合同未生效
                } else if ((contract.getStartDate().isBefore(now) || contract.getStartDate().isEqual(now)) && contract.getEndDate().isAfter(now)) {
                    newStatus = 1; // 合同已生效
                } else if (contract.getEndDate().isBefore(now)) {
                    newStatus = 2; // 合同已过期
                }

                // 只有状态发生变化时才更新
                if (newStatus != null && !newStatus.equals(oldStatus)) {
                    contract.setStatus(newStatus);
                    contractService.updateContract(contract);
                    updateCount++;
                }
            }

            log.info("合同状态检查任务执行完毕，共更新 {} 条合同记录", updateCount);
        } catch (Exception e) {
            log.error("执行合同状态检查任务时发生异常", e);
        }
    }
}
